'use strict'

//创建网页服务器
var path = require("path")
var web_server = require(path.join(__dirname,'admin.js')).web_server
//创建信令服务器
var socketIo =require('socket.io')
var io = socketIo(web_server)



//房间中的用户数量
var num_of_user_in_room = new Map()
//房间号中的用户
var first_user_in_room = new Map()
//用户所在的房间
var room_of_user = new Map()
//用户的对手
var rival_of = new Map()
//用户连接时的操作
io.sockets.on('connection',(socket)=>{
    //首先记录用户id，即使对象被销毁，id依然可用
    let id = socket.id
    //用户申请了某一个房间
    socket.on('room',(room_code)=>{
        if(num_of_user_in_room[room_code]==null){
            //如果是新的房间号
            //第一个用户进入房间
            first_user_in_room[room_code]=socket
            //更新房间中用户的数量
            num_of_user_in_room[room_code]=1
            //记录用户所在的房间
            room_of_user[id]=room_code
            //打印日志：用户id，房间号
            console.log(id,room_code)
        }else if(num_of_user_in_room[room_code]==1){
            //房间中有一个用户正在等待
            //更新房间中用户的数量
            num_of_user_in_room[room_code]=2
            //记录用户所在的房间
            room_of_user[id]=room_code
            //进行对战匹配
            let rival = first_user_in_room[room_code]
            rival_of[id]=rival
            rival_of[rival.id]=socket
            //释放资源
            delete first_user_in_room[room_code]
            //第一个进入的用户首先落子
            //通知先手的一方
            rival.emit('first')
            //打印日志：用户id，房间号
            console.log(id,room_code)
        }else{
            socket.emit('full')
            //打印日志：用户id，失败
            console.log(id,'room is full')
        }
    })
    //用户在棋盘的某处落子
    socket.on('drop',(posi)=>{
        //查看对手是否在线
        if(rival_of[id] != null){
            //通知对手的落点
            rival_of[id].emit('drop',posi)
            //打印日志
            console.log(id,'drop')
        }
    })
    //有用户离线
    socket.on('disconnect',(socket)=>{
        //一方退出，全部离线
        if(rival_of[id] != null){
            //记录对手id
            let rival_id = rival_of[id].id
            //通知对手退出
            rival_of[id].emit('quit')
            delete rival_of[id]
            delete rival_of[rival_id]
        }
        //销毁房间信息
        if(room_of_user[id]!=null){
            if(num_of_user_in_room[room_of_user[id]]!=null){
                delete num_of_user_in_room[room_of_user[id]]
                console.log(id,'num_of_user_in_room.delete',room_of_user[id])
            }
            //用户离开房间
            delete room_of_user[id]
            console.log(id,'room_of_user.delete',id)
        }
        //打印离线用户的信息
        console.log(id,'quit')
    })
})
web_server.listen(3333,'0.0.0.0')